
import java.util.Stack; //se importa la libreria stack para crear una pila



public class ImpPila implements Pila {
	private String linea, operando, error;
	private char dato;
	private int result, operador, contador;
	private boolean verific;
	private Stack < Integer > pil;

	public ImpPila(){
		//se inicializan todos los valores
		linea = " ";
		 pil = new Stack < Integer > ();
		 dato = ' ';
		 result = 0;
		 operador = 0;
		 contador = 0;
		 error = " ";
	}

	public void push(){
		//se converte el dato caracter a numo 
		operador = Character.getNumericValue(dato);
		//luego se realiza un push para ingresarlo a la pila
		pil.push(operador);
	
	}
	//devuleve el String para imprimirlo
	public String getlinea(){
		return linea;
	}
	//se le asigna el string ingresado a la variable linea para tener control desde esta clase
	public void setlinea(String lin){
		linea = lin;
	}
	//se devuelve el contador que lleva la cuenta de en que posision del estring se esta
	public int getcont(){
		return contador;
	}
	//se suma al contador 2, para moverse solo donde hay datos 
	public void setcont(){
		contador = contador + 2;
	}
	//se ferifica que el formato de la instruccion ingresada este correcta, si no hay error devuelve true, y si lo hay false y termina el programa
	public boolean verificador(){
	dato = linea.charAt(contador);
	//se compureba que los primeros dos datos sean un valor numerico
	if(contador < 4){
		if((dato != '1') && (dato != '2') && (dato != '3') && (dato != '4') && (dato != '5') &&(dato != '6') && (dato != '7') && (dato != '8') &&
				(dato != '9') && (dato != '0')){
					verific = false;
				}
		else{
				verific = true;
				}			
		}
		// verifica que en las pociciones donde debe haber un signo haya un signo, y donde debe haber un numero haya un numero
		else{
			if((contador%4) == 0){
				if((dato == '+') || (dato == '-') || (dato == '/') || (dato == '*') ) {
					verific = true;
				}
				else{
					verific = false;
				}
			}
			else{
				
			if((dato != '1') && (dato != '2') && (dato != '3') && (dato != '4') && (dato != '5') &&(dato != '6') && (dato != '7') && (dato != '8') &&
				(dato != '9') && (dato != '0')){
				  
					verific = false;
				}
			else{
				
				verific = true;
				}
			}
	}
	return verific;
	}
	
	//en este metodo se sacan los dos datos que se tengan en la pila, y se operan segun el signo indicado, luego se realiza un push para ingresar el resultado a la pila
	public int pop(){
	dato = linea.charAt(contador);
	result = pil.pop(); 
	operador = pil.pop();
	if(dato == '+'){
		result = result + operador;
		pil.push(result);
	}
	
	if(dato == '/'){
		result = operador / result;
		pil.push(result);
	}
	if(dato == '*'){
		result = result * operador;
		pil.push(result);
	}
	if(dato == '-'){
		result = operador - result;
		pil.push(result);
	
	}
	return result;
	}

	}





